package RandomGames;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import javax.swing.JTextField;

import java.awt.Color;
import java.awt.SystemColor;

import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.SwingConstants;

import java.awt.Component;
import java.awt.Dimension;
import javax.swing.ImageIcon;

public class RandomGames extends JFrame {

	private JPanel contentPane;
	private JScrollPane scrollPane;
	private JPanel panel;
	private JPanel panel_1;
	private JPanel panel_2;
	private JPanel panel_3;
	private JLabel label;
	private JLabel label_1;
	private JLabel label_2;
	private JLabel lblCom;
	private JButton btnNewButton;
	private JButton btnNewButton_1;
	private JButton btnNewButton_2;
	private JButton btnNewButton_3;
	private JButton btnNewButton_4;
	private JButton btnNewButton_5;
	private JButton btnNewButton_7;
	private JButton btnNewButton_8;
	private JButton btnNewButton_6;
	private JTextArea result;
	private JTextField sumu_num;
	private JButton btnStart;
	private JButton btnCorrect;	
	private JButton btnNo;
	private JButton btnClear;
	private JButton btnStart_1;
	static int Max=1000;
	static int Min=1;
	static int count=0;
	static int answer=0;
	static int comRand=0;
	int my,com;
	boolean win=false;
	boolean lose=false;
	
	
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					RandomGames frame = new RandomGames();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public RandomGames() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 850, 450);
		contentPane = new JPanel();
		contentPane.setBackground(Color.PINK);
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);
		contentPane.add(getPanel(), BorderLayout.NORTH);
		contentPane.add(getPanel_1(), BorderLayout.SOUTH);
		contentPane.add(getPanel_2(), BorderLayout.WEST);
		contentPane.add(getScrollPane(), BorderLayout.CENTER);
		contentPane.add(getPanel_3(), BorderLayout.EAST);
	}

	private JPanel getPanel() {
		if (panel == null) {
			panel = new JPanel();
			panel.setBackground(new Color(250, 128, 114));
			panel.add(getLabel());
			panel.add(getBtnNewButton());
			panel.add(getBtnNewButton_1());
			panel.add(getBtnNewButton_2());
			panel.add(getBtnClear());
		}
		return panel;
	}
	private JButton getBtnNewButton() { //가위바위보 - 유저 가위 버튼
		if (btnNewButton == null) {
			btnNewButton = new JButton("가위");
			btnNewButton.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					result.append("\n가위!\n");
					my = 0;
					random();
				}
			});
		}
		return btnNewButton;
	}
	private JButton getBtnNewButton_1() { //가위바위보 - 유저 바위 버튼
		if (btnNewButton_1 == null) {
			btnNewButton_1 = new JButton("바위");
			btnNewButton_1.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					result.append("\n바위!\n");
					my=1;
					random();
				}
			});
		}
		return btnNewButton_1;
	}
	private JButton getBtnNewButton_2() { //가위바위보 - 유저 보 버튼
		if (btnNewButton_2 == null) {
			btnNewButton_2 = new JButton("보");
			btnNewButton_2.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					result.append("\n보!\n");
					my=2;
					random();
				}
			});
		}
		return btnNewButton_2;
	}
	private JPanel getPanel_1() {
		if (panel_1 == null) {
			panel_1 = new JPanel();
			panel_1.setBackground(new Color(250, 128, 114));
			panel_1.add(getLabel_1());
			panel_1.add(getBtnNewButton_3());
			panel_1.add(getBtnNewButton_4());
			panel_1.add(getBtnNewButton_5());
		}
		return panel_1;
	}
	private JButton getBtnNewButton_3() { // 묵찌빠 유저 가위버튼
		if (btnNewButton_3 == null) {
			btnNewButton_3 = new JButton("가위");
			btnNewButton_3.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					result.append("\n가위!\n");
					my=0;
					mukjibar();
				}
			});
		}
		return btnNewButton_3;
	}
	private JButton getBtnNewButton_4() { // 묵찌빠 유저 바위버튼
		if (btnNewButton_4 == null) {
			btnNewButton_4 = new JButton("바위");
			btnNewButton_4.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					result.append("\n바위!\n");
					my=1;
					mukjibar();
				}
			});
		}
		return btnNewButton_4;
	}
	private JButton getBtnNewButton_5() { // 묵찌빠 유저 보버튼
		if (btnNewButton_5 == null) {
			btnNewButton_5 = new JButton("보");
			btnNewButton_5.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					result.append("\n보!\n");
					my=2;
					mukjibar();
				}
			});
		}
		return btnNewButton_5;
	}
	private JLabel getLabel() {
		if (label == null) {
			label = new JLabel("가위 바위 보");
		}
		return label;
	}
	private JLabel getLabel_1() {
		if (label_1 == null) {
			label_1 = new JLabel("묵찌빠");
		}
		return label_1;
	}
	private JPanel getPanel_2() {
		if (panel_2 == null) {
			panel_2 = new JPanel();
			panel_2.setBackground(new Color(255, 165, 0));
			GroupLayout gl_panel_2 = new GroupLayout(panel_2);
			gl_panel_2.setHorizontalGroup(
				gl_panel_2.createParallelGroup(Alignment.LEADING)
					.addGroup(gl_panel_2.createSequentialGroup()
						.addContainerGap()
						.addGroup(gl_panel_2.createParallelGroup(Alignment.TRAILING, false)
							.addGroup(gl_panel_2.createSequentialGroup()
								.addComponent(getSumu_num(), GroupLayout.PREFERRED_SIZE, 82, GroupLayout.PREFERRED_SIZE)
								.addPreferredGap(ComponentPlacement.RELATED)
								.addComponent(getBtnNewButton_6()))
							.addGroup(gl_panel_2.createSequentialGroup()
								.addComponent(getLabel_2())
								.addPreferredGap(ComponentPlacement.RELATED, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
								.addComponent(getBtnStart_1())))
						.addContainerGap(25, Short.MAX_VALUE))
			);
			gl_panel_2.setVerticalGroup(
				gl_panel_2.createParallelGroup(Alignment.LEADING)
					.addGroup(gl_panel_2.createSequentialGroup()
						.addContainerGap()
						.addGroup(gl_panel_2.createParallelGroup(Alignment.BASELINE)
							.addComponent(getBtnStart_1())
							.addComponent(getLabel_2()))
						.addGap(7)
						.addGroup(gl_panel_2.createParallelGroup(Alignment.BASELINE)
							.addComponent(getSumu_num(), GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
							.addComponent(getBtnNewButton_6()))
						.addContainerGap(273, Short.MAX_VALUE))
			);
			gl_panel_2.linkSize(SwingConstants.HORIZONTAL, new Component[] {getSumu_num(), getBtnNewButton_6(), getBtnStart_1()});
			panel_2.setLayout(gl_panel_2);
		}
		return panel_2;
	}
	private JTextField getSumu_num() {
		if (sumu_num == null) {
			sumu_num = new JTextField();
			sumu_num.setColumns(10);
		}
		return sumu_num;
	}
	private JButton getBtnStart_1() { // 스무고개 컴퓨터 숫자 맞추기 Start 버튼
		if (btnStart_1 == null) {
			btnStart_1 = new JButton("Start");
			btnStart_1.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					Max=1000;
					Min=1;
					count=0;
					comRand =(int)(Math.random()*1000)+1; // 컴퓨터가 기억할 숫자를 1~1000 범위 내의 정수로 저장.
					result.append("스무고개를 시작합니다. 제가 기억한 숫자는 무엇일까요? (1~1000)\n");
				}
			});
		}
		return btnStart_1;
	}
	private JButton getBtnNewButton_6() { // 스무고개 컴퓨터 숫자 맞추기 값 입력 버튼
		if (btnNewButton_6 == null) {
			btnNewButton_6 = new JButton("입력");
			btnNewButton_6.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					sumu();
				}
			});
		}
		return btnNewButton_6;
	}
	private JLabel getLabel_2() {
		if (label_2 == null) {
			label_2 = new JLabel("스무고개");
		}
		return label_2;
	}
	private JScrollPane getScrollPane() { // 결과창 TextArea 를 위한 ScrollPane
		if (scrollPane == null) {
			scrollPane = new JScrollPane();
			scrollPane.setViewportView(getResult());
		}
		return scrollPane;
	}
	private JTextArea getResult() { // 결과창 TextArea
		if (result == null) {
			result = new JTextArea();
		}
		return result;
	}
	private JPanel getPanel_3() {
		if (panel_3 == null) {
			panel_3 = new JPanel();
			panel_3.setBackground(new Color(255, 165, 0));
			GroupLayout gl_panel_3 = new GroupLayout(panel_3);
			gl_panel_3.setHorizontalGroup(
				gl_panel_3.createParallelGroup(Alignment.LEADING)
					.addGroup(gl_panel_3.createSequentialGroup()
						.addGroup(gl_panel_3.createParallelGroup(Alignment.LEADING)
							.addGroup(gl_panel_3.createSequentialGroup()
								.addGap(5)
								.addComponent(getLblCom())
								.addGap(12)
								.addComponent(getBtnStart(), GroupLayout.PREFERRED_SIZE, 70, GroupLayout.PREFERRED_SIZE))
							.addGroup(gl_panel_3.createSequentialGroup()
								.addContainerGap()
								.addComponent(getBtnNewButton_7())
								.addPreferredGap(ComponentPlacement.RELATED)
								.addComponent(getBtnNewButton_8()))
							.addGroup(gl_panel_3.createSequentialGroup()
								.addContainerGap()
								.addComponent(getBtnCorrect())
								.addPreferredGap(ComponentPlacement.RELATED)
								.addComponent(getBtnNo())))
						.addContainerGap())
			);
			gl_panel_3.setVerticalGroup(
				gl_panel_3.createParallelGroup(Alignment.LEADING)
					.addGroup(gl_panel_3.createSequentialGroup()
						.addGap(9)
						.addGroup(gl_panel_3.createParallelGroup(Alignment.BASELINE)
							.addComponent(getLblCom())
							.addComponent(getBtnStart()))
						.addPreferredGap(ComponentPlacement.RELATED)
						.addGroup(gl_panel_3.createParallelGroup(Alignment.BASELINE)
							.addComponent(getBtnNewButton_7())
							.addComponent(getBtnNewButton_8()))
						.addPreferredGap(ComponentPlacement.RELATED)
						.addGroup(gl_panel_3.createParallelGroup(Alignment.BASELINE)
							.addComponent(getBtnCorrect())
							.addComponent(getBtnNo()))
						.addContainerGap(84, Short.MAX_VALUE))
			);
			gl_panel_3.linkSize(SwingConstants.HORIZONTAL, new Component[] {getBtnStart(), getBtnNewButton_7(), getBtnNewButton_8(), getBtnCorrect(), getBtnNo()});
			panel_3.setLayout(gl_panel_3);
		}
		return panel_3;
	}
	private JLabel getLblCom() {
		if (lblCom == null) {
			lblCom = new JLabel("스무고개 Com");
		}
		return lblCom;
	}
	private JButton getBtnNewButton_7() {// 스무고개 유저 숫자 맞추기 Up 버튼
		if (btnNewButton_7 == null) {
			btnNewButton_7 = new JButton("Up");
			btnNewButton_7.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					count++; // 질문횟수 카운트를 위한 변수.
					Min=answer; // 컴퓨터가 대답한 값보다 유저의 숫자가 더 크므로 컴퓨터의 숫자를 Min(최소값) 에 저장
					if(count%2==0){ // Math.random() 을 이용한 새로운 범위의 최대, 최소값 사이의 한 숫자를 랜덤으로 던짐.
						answer=((int)(Math.random()*(Max-Min))+Min+1); // 컴퓨터의 질문 횟수가 짝수이면 랜덤으로 질문.
					}else if(count%2==1){ // 컴퓨터의 질문 횟수가 홀수이면 최대+최소값의 정중앙 값을 질문
						answer = (Max+Min)/2;						
					}					
					//answer = (Max+Min)/2;	
					result.append("생각하신 수가 " + answer +" 입니까?\n");
				}
			});
		}
		return btnNewButton_7;
	}
	private JButton getBtnNewButton_8() { // 스무고개 유저 숫자 맞추기 Down 버튼
		if (btnNewButton_8 == null) {
			btnNewButton_8 = new JButton("Down");
			btnNewButton_8.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					count++;
					Max=answer-1; // 컴퓨터가 대답한 값보다 유저의 숫자가 더 작으므로 컴퓨터의 숫자를 Max(최대값) 에 저장
					if(count%2==0){ // 컴퓨터의 질문 횟수가 짝수일때
						answer=(int)((Math.random()*(Max-Min))+Min+1); // Math.random() 을 이용한 새로운 범위의 최대, 최소값 사이의 한 숫자를 랜덤으로 던짐.
					}else if(count%2==1){ // 컴퓨터의 질문 횟수가 홀수일 때 최대+최소값의 정중앙 값을 질문
						answer = (Max+Min)/2; 						
					}					
					
					//answer = (Max+Min)/2;					
					result.append("생각하신 수가 " + answer +" 입니까?\n");
				}
			});
		}
		return btnNewButton_8;
	}
	private JButton getBtnStart() { // 스무고개 유저숫자 맞추기 시작버튼
		if (btnStart == null) {
			btnStart = new JButton("Start");
			btnStart.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					count=0; // 컴퓨터의 질문 횟수를 초기화
					Max=1000; // 최대값 초기화
					Min=1; // 최소값 초기화
					result.setText(""); // 결과창 공백으로 리셋
					answer=(int)(Math.random()*1000)+1; // 처음 질문시 랜덤일지, 중앙수를 던질지 결정하기 위한 알고리즘
					//answer=(Max+Min)/2; // 
					result.append("생각하신 수가 " + answer +" 입니까?\n"); // 사용자에게 질문.
					count++; // 질문횟수 +1 
					
				}
			});
		}
		return btnStart;
	}
	private JButton getBtnCorrect() { // 스무고개 유저 숫자 맞추기 Correct 버튼
		if (btnCorrect == null) {
			btnCorrect = new JButton("Correct!");
			btnCorrect.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					result.setText("정답입니다. \n질문 횟수 : " + count);
				}
			});
		}
		return btnCorrect;
	}
	private JButton getBtnNo() {// 스무고개 유저 숫자 맞추기 No 버튼
		if (btnNo == null) {
			btnNo = new JButton("No!");
		}
		return btnNo;
	}
	private JButton getBtnClear() {// Text Area Clear 버튼
		if (btnClear == null) {
			btnClear = new JButton("Clear!");
			btnClear.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					result.setText("");
				}
			});
		}
		return btnClear;
	}
	public void random(){ // 가위바위보 메서드
		com = (int)(Math.random()*3);
		
		if(com==0) result.append("컴퓨터는 가위\n");
		else if(com==1) result.append("컴퓨터는 바위\n");
		else if(com==2) result.append("컴퓨터는 보\n");
		
		
		if (my == com)
			result.append("비겼습니다.\n");
		else if (my == 0 && com == 2)
			result.append("이겼습니다.\n");
		else if (my == 1 && com == 0)
			result.append("이겼습니다.\n");
		else if (my == 2 && com == 1)
			result.append("이겼습니다.\n");
		else if (my == 0 && com == 1)
			result.append("졌습니다.\n");
		else if (my == 1 && com == 2)
			result.append("졌습니다.\n");
		else if (my == 2 && com == 0)
			result.append("졌습니다.\n");
	}
	public void mukjibar(){ // 묵찌빠 메서드
		com = (int)(Math.random()*3);
		
		if(com==0) result.append("컴퓨터는 가위\n");
		else if(com==1) result.append("컴퓨터는 바위\n");
		else if(com==2) result.append("컴퓨터는 보\n");		
		
		if (my == com && win == false && lose == false){
			result.append("비겼습니다.\n");
		}else if(my == com && win == true){
			result.append("당신이 이겼습니다..\n");
			win=false;
			lose=false;
		}else if(my == com && lose == true){
			result.append("당신이 졌습니다..\n");
			win=false;
			lose=false;
		}else if(my == 0 && com == 2){
			result.append("당신이 유리한 상황.\n");
			win=true;
			lose=false;
		}else if(my == 0 && com == 1){
			result.append("당신이 불리한 상황.\n");
			win=false;
			lose=true;
		}else if(my == 1 && com == 0){
			result.append("당신이 유리한 상황.\n");
			win=true;
			lose=false;
		}else if(my == 1 && com == 2){
			result.append("당신이 불리한 상황.\n");
			win=false;
			lose=true;
		}else if(my == 2 && com == 1){
			result.append("당신이 유리한 상황.\n");
			win=true;
			lose=false;
		}else if(my == 2 && com == 0){
			result.append("당신이 불리한 상황.\n");
			win=false;
			lose=true;
		}		
	}
	public void sumu(){ // 스무고개 컴퓨터 숫자 맞추기 메서드		
		try{
			int temp = Integer.parseInt(sumu_num.getText());
			if (temp >=Min && temp <=Max){
				count++;
				if(temp > comRand){ // 사용자가 입력한 값이 컴퓨터가 기억한 값보다 클때, 사용자의 값을 Max에 저장
					Max = temp;
					result.append("입력하신 값 "+temp+" 가 컴퓨터의 숫자보다 큽니다.\n");
					result.append("현재 최소 값 : "+Min+"현재 최대 값 : "+Max+"\n"); // 새로운 범위의 Min, Max 값을 출력하여 사용자가 선택할 수 있게한다.				
				}else if(temp < comRand){// 사용자가 입력한 값이 컴퓨터가 기억한 값보다 작을 때, 사용자의 값을 Min에 저장
					Min=temp;
					result.append("입력하신 값 "+temp+" 가 컴퓨터의 숫자보다 작습니다.\n");
					result.append("현재 최소 값 : "+Min+"현재 최대 값 : "+Max+"\n"); // 새로운 범위의 Min, Max 값을 출력하여 사용자가 선택할 수 있게한다.	
				}else if(temp == comRand){
					result.append("\n\n\n정답입니다!!!!!");
					result.append("입력하신 값 "+temp+" 가 컴퓨터가 기억한 숫자입니다.\n");
					result.append("당신의 질문 횟수 : "+count+"\n");
					Max=1000;
					Min=1;
					count=0;
				}
			}else{
				result.append(Min+"~"+Max+"숫자만 입력해주세요.\n");
			}
		}catch(Exception ex){
			result.append(Min+"~"+Max+"숫자만 입력해주세요.\n");
		}		
	}
}
